{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Deep Reinforcement Learning\n",
    "\n",
    "![mario](./images/mario.jpg)\n",
    "\n",
    "Reinforcement learning is one of the hottest (if not the hottest) area of deep learning. It is possibly the closest that we have come to achieving general AI at this point in time. The reason it is touted as getting close to general AI is that we can use the same framework repeatedly in different environments to maximise future rewards. Apart from the ATARI games in which [Deep Reinforcement Learning got famous](https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf) for and beating the current world GO chamption, it is now being used in finance and [teaching robots to walk](https://www.youtube.com/watch?v=JFJkpVWTQVM).\n",
    "\n",
    "The general concept of RL is to simulate game a large number of times and to learn which actions constitutes a good move. One of the biggest challenges that RL faces is to infer what constitutes a good move. A good move at the current state might be a bad move for future states. This is definitely the case in playing chess for example where you constantly sacrifice pieces for larger future rewards.\n",
    "\n",
    "## Belman Equation\n",
    "\n",
    "The goal of reinforcement learning is to maximise its return. In this tutorial we get 'envirnonments' from OpenAI which provides us a game, the physics/ rules by which the game is controlled by and outputs the **rewards** achieved for a given **action**, at the current **state** of the game.\n",
    "\n",
    "The bellman equation plays a crucial role in reinforcement learning.\n",
    "\\begin{align}\n",
    "Q(S_t)(a_t) = r_t + \\gamma\\max_{a_{t+1}}Q(S_{t+1})(a_{t+1})\n",
    "\\end{align}\n",
    "where $Q$ is a quality function, which depends on state $S_t$ and outputs the maximum possible future reward for action $a_t$. $\\gamma$ is a discount factor. Most texts would prefer to depict the Quality function as $Q(S_t, a_t)$, however I wish to stress that $Q(S_t)$ outputs the maximum discounted future reward for all actions. $a_t$ is in this tutorial, a one-hot encoded variable which helps to choose a reward for all possible actions. **Notice how could recursively expand this function.**\n",
    "\n",
    "## Pseudocode for DQN\n",
    "Reference: https://github.com/yenchenlin/DeepLearningFlappyBird\n",
    "```\n",
    "Initialize replay memory D to size N\n",
    "Initialize action-value function Q with random weights\n",
    "for episode = 1, M do\n",
    "    Initialize state s_1\n",
    "    for t = 1, T do\n",
    "        With probability ϵ select random action a_t\n",
    "        otherwise select a_t=max_a  Q(s_t,a; θ_i)\n",
    "        Execute action a_t in emulator and observe r_t and s_(t+1)\n",
    "        Store transition (s_t,a_t,r_t,s_(t+1)) in D\n",
    "        Sample a minibatch of transitions (s_j,a_j,r_j,s_(j+1)) from D\n",
    "        Set y_j:=\n",
    "            r_j for terminal s_(j+1)\n",
    "            r_j+γ*max_(a^' )  Q(s_(j+1),a'; θ_i) for non-terminal s_(j+1)\n",
    "        Perform a gradient step on (y_j-Q(s_j,a_j; θ_i))^2 with respect to θ\n",
    "    end for\n",
    "end for\n",
    "```\n",
    "\n",
    "\n",
    "## Reference:\n",
    "\n",
    "- https://keon.io/deep-q-learning/\n",
    "- http://mckinziebrandon.me/TensorflowNotebooks/2016/12/21/openai.html\n",
    "- https://github.com/yenchenlin/DeepLearningFlappyBird\n",
    "- [Playing Atari with Deep Reinforcement Learning](https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf)\n",
    "- [OpenAI environments](https://gym.openai.com/envs/)\n",
    "- https://www.youtube.com/watch?v=JFJkpVWTQVM\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "!pip install gym\n",
    "!conda install -y JSAnimation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import re\n",
    "\n",
    "from keras.models import Sequential, Model\n",
    "from keras.layers import Dense, Input, Dot\n",
    "from keras.models import load_model, model_from_json\n",
    "from keras.optimizers import Adam\n",
    "\n",
    "import gym\n",
    "\n",
    "from collections import deque\n",
    "\n",
    "import time\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "# Imports specifically so we can render outputs in Jupyter.\n",
    "from JSAnimation.IPython_display import display_animation\n",
    "from matplotlib import animation\n",
    "from IPython.display import display"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def create_model(n_states, n_actions):\n",
    "    \n",
    "    state = Input(shape=(n_states,))\n",
    "    # TODO: Fill in the following with 2 Dense Layers\n",
    "    # see https://keras.io/getting-started/functional-api-guide/\n",
    "    x1 = \n",
    "    x2 = \n",
    "    out = Dense(n_actions)(x2)\n",
    "    actions = Input(shape=(n_actions,))\n",
    "    out2 = Dot(axes=-1)([out, actions])\n",
    "\n",
    "    model = Model(inputs=[state, actions], outputs=out2)\n",
    "    model.compile(loss='mse', optimizer='rmsprop')\n",
    "    \n",
    "    model2 = Model(inputs=state, outputs=out)\n",
    "\n",
    "    return model, model2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def train_data(minibatch, model):\n",
    "    s_j_batch = np.array([d[0] for d in minibatch])\n",
    "    a_batch = np.array([d[1] for d in minibatch])\n",
    "    r_batch = np.array([d[2] for d in minibatch])\n",
    "    s_j1_batch = np.array([d[3] for d in minibatch])\n",
    "    terminal_batch = np.array([d[4] for d in minibatch])\n",
    "\n",
    "    ##############################################################\n",
    "    # The following 3 lines are the most important part of Deep RL\n",
    "    ##############################################################\n",
    "    readout_j1_batch = model.predict(s_j1_batch, batch_size=BATCH)\n",
    "    y_batch = r_batch + GAMMA * np.max(readout_j1_batch, axis=1)\n",
    "    y_batch[terminal_batch] = r_batch[terminal_batch]\n",
    "    \n",
    "    return s_j_batch, a_batch, y_batch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## OpenAI functions\n",
    "\n",
    "- env = gym.make(environment_name) <- sets up the environment\n",
    "- env.reset() <- resets the environment to starting point\n",
    "- env.step(action) <- takes action and goes to state $S_{t+1}$ \n",
    "- env.render() <- render the output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[2017-10-18 18:24:26,754] Making new env: CartPole-v0\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode : 0 , time taken:  0.04702281951904297 s, average up time:  1.0\n",
      "Episode : 5000 , time taken:  1.6890149116516113 s, average up time:  8.63\n",
      "Episode : 10000 , time taken:  11.951380014419556 s, average up time:  34.5\n",
      "Episode : 15000 , time taken:  13.010540962219238 s, average up time:  56.53\n",
      "Episode : 20000 , time taken:  11.975058794021606 s, average up time:  25.17\n",
      "Episode : 25000 , time taken:  11.041939973831177 s, average up time:  44.6\n",
      "Episode : 30000 , time taken:  11.701272964477539 s, average up time:  35.91\n",
      "Episode : 35000 , time taken:  11.184820890426636 s, average up time:  30.13\n",
      "Episode : 40000 , time taken:  11.266594886779785 s, average up time:  26.49\n",
      "Episode : 45000 , time taken:  11.33695912361145 s, average up time:  28.31\n",
      "Episode : 50000 , time taken:  11.028918027877808 s, average up time:  60.2\n",
      "Episode : 55000 , time taken:  11.333147048950195 s, average up time:  85.6\n",
      "Episode : 60000 , time taken:  11.429896831512451 s, average up time:  105.24\n",
      "Episode : 65000 , time taken:  10.855633974075317 s, average up time:  129.07\n",
      "Episode : 70000 , time taken:  10.938822984695435 s, average up time:  153.11\n",
      "Episode : 75000 , time taken:  10.609338998794556 s, average up time:  156.1\n",
      "Episode : 80000 , time taken:  10.61500597000122 s, average up time:  149.9\n",
      "Episode : 85000 , time taken:  10.69183897972107 s, average up time:  156.1\n",
      "Episode : 90000 , time taken:  10.760807037353516 s, average up time:  158.02\n",
      "Episode : 95000 , time taken:  11.041198015213013 s, average up time:  144.79\n"
     ]
    }
   ],
   "source": [
    "env = gym.make('CartPole-v0')\n",
    "STATES, ACTIONS = env.observation_space.shape[0], env.action_space.n\n",
    "model, out = create_model(STATES, ACTIONS)\n",
    "INITIAL_EPSILON = 1e-1\n",
    "FINAL_EPSILON = 1e-4\n",
    "DECAY = 0.9\n",
    "GAMMA = 0.9 # decay rate of past observations\n",
    "OBSERVE = 5000. # timesteps to observe before training\n",
    "REPLAY_MEMORY = 5000 # number of previous transitions to remember\n",
    "TIME_LIMIT = 100000\n",
    "BATCH = 128\n",
    "# open up a game state to communicate with emulator\n",
    "state = env.reset()\n",
    "\n",
    "# store the previous observations in replay memory\n",
    "D = deque(maxlen=REPLAY_MEMORY)\n",
    "loss = []\n",
    "\n",
    "a_t = np.zeros(ACTIONS)\n",
    "a_t[np.random.choice(ACTIONS)] = 1\n",
    "s_t, r_0, terminal, _ = env.step(np.argmax(a_t))\n",
    "\n",
    "# start training\n",
    "epsilon = INITIAL_EPSILON\n",
    "\n",
    "up_time = [0]\n",
    "start = time.time()\n",
    "for t in range(TIME_LIMIT):\n",
    "    # choose an action\n",
    "    readout_t = out.predict(s_t[None, :])\n",
    "    a_t = np.zeros([ACTIONS])\n",
    "    if np.random.random() <= epsilon:\n",
    "        a_t[np.random.choice(ACTIONS)] = 1\n",
    "    else:\n",
    "        a_t[np.argmax(readout_t)] = 1\n",
    "\n",
    "    # scale down epsilon\n",
    "    if epsilon > FINAL_EPSILON and t > OBSERVE:\n",
    "        # TODO: decay the epsilon value\n",
    "        epsilon = \n",
    "\n",
    "    # run the selected action and observe next state and reward\n",
    "    # store the transition in D\n",
    "    # TODO: Take a step for the current environment (see lines above this cell)\n",
    "    s_t1, r_t, terminal, _ = \n",
    "    D.append((s_t, a_t, r_t, s_t1, terminal))\n",
    "    \n",
    "    if terminal:\n",
    "        up_time.append(0)\n",
    "        env.reset()\n",
    "    else:\n",
    "        up_time[-1] += r_t\n",
    "    \n",
    "    # only train if done observing\n",
    "    if t > OBSERVE:\n",
    "        # sample a minibatch to train on\n",
    "        idx = np.random.choice(REPLAY_MEMORY, BATCH, replace=False)\n",
    "        minibatch = [D[i] for i in idx]\n",
    "        # get the batch variables\n",
    "        s_t_batch, a_batch, y_batch = train_data(minibatch, out)\n",
    "        # perform gradient step\n",
    "        loss.append(model.train_on_batch([s_t_batch, a_batch], y_batch))\n",
    "\n",
    "    # update the old state\n",
    "    s_t = s_t1\n",
    "        \n",
    "    if t%(TIME_LIMIT/20)==0:\n",
    "        print('Episode :', t, ', time taken: ', time.time() - start, 's, average up time: ',np.mean(up_time[-100:]))\n",
    "        start = time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAskAAAEyCAYAAAAIiE2qAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xe8FNXZB/DfuZ1eL0iTC4ggKgICFuxiQTRYE0vU2IiJ\neWN9fbFrlARLTDS22GIvaIwaEayAIM1L73LpnUuHe7lt97x/7MzuzOyZtjt7d/fy+34+fNidnZ05\nW+7Os88+8xwhpQQREREREcXkpHsARERERESZhkEyEREREZEFg2QiIiIiIgsGyUREREREFgySiYiI\niIgsGCQTEREREVkwSCYiIiIismCQTERERERkwSCZiIiIiMgiL90DAIC2bdvKkpKSdA+DiIiIiBq4\n2bNnb5dSFrutlxFBcklJCUpLS9M9DCIiIiJq4IQQa72sx3ILIiIiIiILBslERERERBYMkomIiIiI\nLBgkExERERFZMEgmIiIiIrJgkExEREREZMEgmYiIiIjIgkEyEREREZEFg2QiIiIiIgsGyUREREQU\nZ92OSqzeXpHuYaSN5yBZCJErhJgrhPhCu95NCDFTCFEmhPhQCFGgLS/Urpdpt5ekZuhERERElCqn\nPDkRpz81Kd3DSBs/meRbASw1XH8cwN+klIcB2AXgBm35DQB2acv/pq1HRERERJQ1PAXJQojOAIYD\neFW7LgCcAeBjbZU3AVyoXR6hXYd2+5na+kREREREWcFrJvnvAO4GENautwGwW0pZp13fAKCTdrkT\ngPUAoN2+R1vfRAgxUghRKoQoLS8vT3D4RERERETBcw2ShRDnA9gmpZwd5I6llC9LKQdKKQcWFxcH\nuWkiIiIioqTkeVhnCIBfCCHOA1AEoDmAZwC0FELkadnizgA2autvBNAFwAYhRB6AFgB2BD5yIiIi\nIqIUcc0kSynvkVJ2llKWALgcwPdSyqsATARwqbbatQA+0y5/rl2Hdvv3UkoZ6KiJiIiIiFIomT7J\n/wfgDiFEGSI1x69py18D0EZbfgeAUckNkYiIiIiofnkpt4iSUk4CMEm7vArAYMU6VQAuC2BsRERE\nRERpwRn3iIiIiIgsGCQTEREREVkwSCYiIiIismCQTERERERkwSCZiIiIiMiCQTIRERERkQWDZCIi\nIiIiCwbJREREREQWDJKJiIiIiCwYJBMRERERWTBIJiIiIiKyYJBMRERERGTBIJmIiIiIyIJBMhER\nERGRBYNkIiIiIiILBslERERERBYMkomIiIiILBgkExERERFZMEgmIiIiIrJgkExEREREZMEgmYiI\niIjIgkEyEREREZGFa5AshCgSQswSQswXQiwWQjyiLX9DCLFaCDFP+9dPWy6EEM8KIcqEEAuEEANS\n/SCIiIiIiIKU52GdagBnSCn3CyHyAUwVQozXbvtfKeXHlvWHAeip/TsOwIva/0REREREWcE1kywj\n9mtX87V/0uEuIwC8pd1vBoCWQogOyQ+ViIiIiKh+eKpJFkLkCiHmAdgG4Bsp5UztptFaScXfhBCF\n2rJOANYb7r5BW0ZERERElBU8BclSypCUsh+AzgAGCyGOAnAPgN4ABgFoDeD//OxYCDFSCFEqhCgt\nLy/3OWwiIiIiotTx1d1CSrkbwEQA50opN2slFdUA/gVgsLbaRgBdDHfrrC2zbutlKeVAKeXA4uLi\nxEZPRERERJQCXrpbFAshWmqXGwE4C8Ayvc5YCCEAXAhgkXaXzwFco3W5OB7AHinl5pSMnoiIiIgo\nBbx0t+gA4E0hRC4iQfVYKeUXQojvhRDFAASAeQBu1tb/EsB5AMoAVAK4LvhhExERERGljmuQLKVc\nAKC/YvkZNutLALckPzQiIiIiovTgjHtERERERBYMkomIiIiILBgkExERERFZMEgmIiIiIrJgkExE\nREREZMEgmYiIiIjIgkEyERERURKqakPYU1mb7mFQwBgkExERESXhyldm4Jg/fZ3uYVDAGCQTERER\nJWHOut3pHgKlAINkIiIiIiILBslERERERBYMkomIiIiILBgkExERERFZMEgmIiIiIrJgkExERESU\nYnWhMGpD4XQPg3xgkExERESUYqc+OQk97xuf7mGQDwySiYiIiFJs4+4D6R4C+cQgmYiIiIjIgkEy\nEREREZEFg2QiIiIiIgsGyUREREREFgySiYiIiAIgpUz3EChArkGyEKJICDFLCDFfCLFYCPGItryb\nEGKmEKJMCPGhEKJAW16oXS/Tbi9J7UMgIiIiSr8wY+QGxUsmuRrAGVLKYwD0A3CuEOJ4AI8D+JuU\n8jAAuwDcoK1/A4Bd2vK/aesRERERNWjMJDcsrkGyjNivXc3X/kkAZwD4WFv+JoALtcsjtOvQbj9T\nCCECGzERERFRBmImuWHxVJMshMgVQswDsA3ANwBWAtgtpazTVtkAoJN2uROA9QCg3b4HQJsgB01E\n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\nRK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x106c2f470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(12, 5))\n",
    "plt.plot(up_time)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAEyCAYAAAAY6AN2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8U1X6P/DP6UrZZRFEwIKKiqO4VMEVFRQUfzA6OqMz\n6jiOOo7OjN8ZxxH3XVHcwH0BNwQX3NCy75S97C0FWqC00JYWSvc1yfn9kZs0SbPcJPfmJjef9+vV\nF1lubp42IXnuuc95jpBSgoiIiIjIrBKMDoCIiIiISE9MeImIiIjI1JjwEhEREZGpMeElIiIiIlNj\nwktEREREpsaEl4iIiIhMjQkvEREREZkaE14iIiIiMjUmvERERERkakl67LRXr14yPT1dj10TERER\nEQEANm3adERK2TvQdrokvOnp6cjOztZj10REREREAAAhxAE127GkgYiIiIhMjQkvEREREZkaE14i\nIiIiMjUmvERERERkakx4iYiIiMjUmPASERERkampSniFEN2FELOFELuEEHlCiIv0DoyIiIiISAtq\n+/BOATBfSnmTECIFQEcdYyIiIiIi0kzAhFcI0Q3A5QDuBAApZQuAFn3DIiIiIiLShpqShkEAKgB8\nKoTYIoT4RAjRyXMjIcS9QohsIUR2RUWF5oHqIa+0BuU1TUaHQUREREQ6UpPwJgE4D8D7UspzAdQD\nmOi5kZTyIyllhpQyo3fvgEsaR4Vrp6zCZa8uMzoMIiIiItKRmoT3IICDUsr1yvXZsCfAptBssRkd\nAhERERHpKGDCK6UsA1AshDhNuWkUgJ26RkVEREREpBG1XRr+CeArpUPDPgB/0S8kIiIiIiLtqEp4\npZRbAWToHAsRERERkea40hoRERERmVpcJrzr9x1F+sRMo8MgIiIiogiIy4T3u00HjQ6BiIiIiCIk\nLhNeIiIiIoofTHiJiIiIyNSY8BIRERGRqTHhJSIiIiJTY8JLRERERKbGhJeIiIiITC0uE15hdABE\nREREFDFxmfASERERUfyIy4Q3t6TG6BCIiIiIKELiMuHdWcqEl4iIiChexGXCS0RERETxgwkvERER\nEZla3CW8UkqjQyAiIiKiCIq7hJeIiIiI4gsTXiIiIiIyNSa8RERERGRqTHgBPP/rTqNDICIiIiKd\nMOEFMC1rv9EhEBEREZFOmPASERERkakx4SUiIiIiU2PCS0RERESmxoSXiIiIiEyNCS8RERERmRoT\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1058b5780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(12, 5))\n",
    "plt.plot(loss)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Only run the following if you are running it locally and not in Docker**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def display_frames_as_gif(frames):\n",
    "    \"\"\"\n",
    "    Displays a list of frames as a gif, with controls\n",
    "    \"\"\"\n",
    "    #plt.figure(figsize=(frames[0].shape[1] / 72.0, frames[0].shape[0] / 72.0), dpi = 72)\n",
    "    patch = plt.imshow(frames[0])\n",
    "    plt.axis('off')\n",
    "\n",
    "    def animate(i):\n",
    "        patch.set_data(frames[i])\n",
    "\n",
    "    anim = animation.FuncAnimation(plt.gcf(), animate, frames = len(frames), interval=50)\n",
    "    display(display_animation(anim, default_mode='once'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[2017-10-18 18:28:03,126] Making new env: CartPole-v0\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<script language=\"javascript\">\n",
       "  /* Define the Animation class */\n",
       "  function Animation(frames, img_id, slider_id, interval, loop_select_id){\n",
       "    this.img_id = img_id;\n",
       "    this.slider_id = slider_id;\n",
       "    this.loop_select_id = loop_select_id;\n",
       "    this.interval = interval;\n",
       "    this.current_frame = 0;\n",
       "    this.direction = 0;\n",
       "    this.timer = null;\n",
       "    this.frames = new Array(frames.length);\n",
       "\n",
       "    for (var i=0; i<frames.length; i++)\n",
       "    {\n",
       "     this.frames[i] = new Image();\n",
       "     this.frames[i].src = frames[i];\n",
       "    }\n",
       "    document.getElementById(this.slider_id).max = this.frames.length - 1;\n",
       "    this.set_frame(this.current_frame);\n",
       "  }\n",
       "\n",
       "  Animation.prototype.get_loop_state = function(){\n",
       "    var button_group = document[this.loop_select_id].state;\n",
       "    for (var i = 0; i < button_group.length; i++) {\n",
       "        var button = button_group[i];\n",
       "        if (button.checked) {\n",
       "            return button.value;\n",
       "        }\n",
       "    }\n",
       "    return undefined;\n",
       "  }\n",
       "\n",
       "  Animation.prototype.set_frame = function(frame){\n",
       "    this.current_frame = frame;\n",
       "    document.getElementById(this.img_id).src = this.frames[this.current_frame].src;\n",
       "    document.getElementById(this.slider_id).value = this.current_frame;\n",
       "  }\n",
       "\n",
       "  Animation.prototype.next_frame = function()\n",
       "  {\n",
       "    this.set_frame(Math.min(this.frames.length - 1, this.current_frame + 1));\n",
       "  }\n",
       "\n",
       "  Animation.prototype.previous_frame = function()\n",
       "  {\n",
       "    this.set_frame(Math.max(0, this.current_frame - 1));\n",
       "  }\n",
       "\n",
       "  Animation.prototype.first_frame = function()\n",
       "  {\n",
       "    this.set_frame(0);\n",
       "  }\n",
       "\n",
       "  Animation.prototype.last_frame = function()\n",
       "  {\n",
       "    this.set_frame(this.frames.length - 1);\n",
       "  }\n",
       "\n",
       "  Animation.prototype.slower = function()\n",
       "  {\n",
       "    this.interval /= 0.7;\n",
       "    if(this.direction > 0){this.play_animation();}\n",
       "    else if(this.direction < 0){this.reverse_animation();}\n",
       "  }\n",
       "\n",
       "  Animation.prototype.faster = function()\n",
       "  {\n",
       "    this.interval *= 0.7;\n",
       "    if(this.direction > 0){this.play_animation();}\n",
       "    else if(this.direction < 0){this.reverse_animation();}\n",
       "  }\n",
       "\n",
       "  Animation.prototype.anim_step_forward = function()\n",
       "  {\n",
       "    this.current_frame += 1;\n",
       "    if(this.current_frame < this.frames.length){\n",
       "      this.set_frame(this.current_frame);\n",
       "    }else{\n",
       "      var loop_state = this.get_loop_state();\n",
       "      if(loop_state == \"loop\"){\n",
       "        this.first_frame();\n",
       "      }else if(loop_state == \"reflect\"){\n",
       "        this.last_frame();\n",
       "        this.reverse_animation();\n",
       "      }else{\n",
       "        this.pause_animation();\n",
       "        this.last_frame();\n",
       "      }\n",
       "    }\n",
       "  }\n",
       "\n",
       "  Animation.prototype.anim_step_reverse = function()\n",
       "  {\n",
       "    this.current_frame -= 1;\n",
       "    if(this.current_frame >= 0){\n",
       "      this.set_frame(this.current_frame);\n",
       "    }else{\n",
       "      var loop_state = this.get_loop_state();\n",
       "      if(loop_state == \"loop\"){\n",
       "        this.last_frame();\n",
       "      }else if(loop_state == \"reflect\"){\n",
       "        this.first_frame();\n",
       "        this.play_animation();\n",
       "      }else{\n",
       "        this.pause_animation();\n",
       "        this.first_frame();\n",
       "      }\n",
       "    }\n",
       "  }\n",
       "\n",
       "  Animation.prototype.pause_animation = function()\n",
       "  {\n",
       "    this.direction = 0;\n",
       "    if (this.timer){\n",
       "      clearInterval(this.timer);\n",
       "      this.timer = null;\n",
       "    }\n",
       "  }\n",
       "\n",
       "  Animation.prototype.play_animation = function()\n",
       "  {\n",
       "    this.pause_animation();\n",
       "    this.direction = 1;\n",
       "    var t = this;\n",
       "    if (!this.timer) this.timer = setInterval(function(){t.anim_step_forward();}, this.interval);\n",
       "  }\n",
       "\n",
       "  Animation.prototype.reverse_animation = function()\n",
       "  {\n",
       "    this.pause_animation();\n",
       "    this.direction = -1;\n",
       "    var t = this;\n",
       "    if (!this.timer) this.timer = setInterval(function(){t.anim_step_reverse();}, this.interval);\n",
       "  }\n",
       "</script>\n",
       "\n",
       "<div class=\"animation\" align=\"center\">\n",
       "    <img id=\"_anim_imgHEJQZZPHOHXHIASP\">\n",
       "    <br>\n",
       "    <input id=\"_anim_sliderHEJQZZPHOHXHIASP\" type=\"range\" style=\"width:350px\" name=\"points\" min=\"0\" max=\"1\" step=\"1\" value=\"0\" onchange=\"animHEJQZZPHOHXHIASP.set_frame(parseInt(this.value));\"></input>\n",
       "    <br>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.slower()\">&#8211;</button>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.first_frame()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.previous_frame()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.reverse_animation()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.pause_animation()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.play_animation()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.next_frame()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.last_frame()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animHEJQZZPHOHXHIASP.faster()\">+</button>\n",
       "  <form action=\"#n\" name=\"_anim_loop_selectHEJQZZPHOHXHIASP\" class=\"anim_control\">\n",
       "    <input type=\"radio\" name=\"state\" value=\"once\" checked> Once </input>\n",
       "    <input type=\"radio\" name=\"state\" value=\"loop\" > Loop </input>\n",
       "    <input type=\"radio\" name=\"state\" value=\"reflect\" > Reflect </input>\n",
       "  </form>\n",
       "</div>\n",
       "\n",
       "\n",
       "<script language=\"javascript\">\n",
       "  /* Instantiate the Animation class. */\n",
       "  /* The IDs given should match those used in the template above. */\n",
       "  (function() {\n",
       "    var img_id = \"_anim_imgHEJQZZPHOHXHIASP\";\n",
       "    var slider_id = \"_anim_sliderHEJQZZPHOHXHIASP\";\n",
       "    var loop_select_id = \"_anim_loop_selectHEJQZZPHOHXHIASP\";\n",
       "    var frames = new Array(0);\n",
       "    \n",
       "  frames[0] = \"\"\n",
       "  frames[1] = \"\"\n",
       "  frames[2] = \"\"\n",
       "  frames[3] = \"\"\n",
       "  frames[4] = \"\"\n",
       "  frames[5] = \"\"\n",
       "  frames[6] = \"\"\n",
       "  frames[7] = \"\"\n",
       "  frames[8] = \"\"\n",
       "  frames[9] = \"\"\n",
       "  frames[10] = \"\"\n",
       "  frames[11] = \"\"\n",
       "  frames[12] = \"\"\n",
       "\n",
       "\n",
       "    /* set a timeout to make sure all the above elements are created before\n",
       "       the object is initialized. */\n",
       "    setTimeout(function() {\n",
       "        animHEJQZZPHOHXHIASP = new Animation(frames, img_id, slider_id, 50, loop_select_id);\n",
       "    }, 0);\n",
       "  })()\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "12\n"
     ]
    }
   ],
   "source": [
    "env = gym.make('CartPole-v0')\n",
    "\n",
    "# Run a demo of the environment\n",
    "observation = env.reset()\n",
    "cum_reward = 0\n",
    "frames = []\n",
    "for t in range(5000):\n",
    "    # Render into buffer. \n",
    "    frames.append(env.render(mode = 'rgb_array'))\n",
    "    action = env.action_space.sample()\n",
    "    observation, reward, done, info = env.step(action)\n",
    "    if done:\n",
    "        break\n",
    "env.render(close=True)\n",
    "display_frames_as_gif(frames)\n",
    "print(t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<script language=\"javascript\">\n",
       "  /* Define the Animation class */\n",
       "  function Animation(frames, img_id, slider_id, interval, loop_select_id){\n",
       "    this.img_id = img_id;\n",
       "    this.slider_id = slider_id;\n",
       "    this.loop_select_id = loop_select_id;\n",
       "    this.interval = interval;\n",
       "    this.current_frame = 0;\n",
       "    this.direction = 0;\n",
       "    this.timer = null;\n",
       "    this.frames = new Array(frames.length);\n",
       "\n",
       "    for (var i=0; i<frames.length; i++)\n",
       "    {\n",
       "     this.frames[i] = new Image();\n",
       "     this.frames[i].src = frames[i];\n",
       "    }\n",
       "    document.getElementById(this.slider_id).max = this.frames.length - 1;\n",
       "    this.set_frame(this.current_frame);\n",
       "  }\n",
       "\n",
       "  Animation.prototype.get_loop_state = function(){\n",
       "    var button_group = document[this.loop_select_id].state;\n",
       "    for (var i = 0; i < button_group.length; i++) {\n",
       "        var button = button_group[i];\n",
       "        if (button.checked) {\n",
       "            return button.value;\n",
       "        }\n",
       "    }\n",
       "    return undefined;\n",
       "  }\n",
       "\n",
       "  Animation.prototype.set_frame = function(frame){\n",
       "    this.current_frame = frame;\n",
       "    document.getElementById(this.img_id).src = this.frames[this.current_frame].src;\n",
       "    document.getElementById(this.slider_id).value = this.current_frame;\n",
       "  }\n",
       "\n",
       "  Animation.prototype.next_frame = function()\n",
       "  {\n",
       "    this.set_frame(Math.min(this.frames.length - 1, this.current_frame + 1));\n",
       "  }\n",
       "\n",
       "  Animation.prototype.previous_frame = function()\n",
       "  {\n",
       "    this.set_frame(Math.max(0, this.current_frame - 1));\n",
       "  }\n",
       "\n",
       "  Animation.prototype.first_frame = function()\n",
       "  {\n",
       "    this.set_frame(0);\n",
       "  }\n",
       "\n",
       "  Animation.prototype.last_frame = function()\n",
       "  {\n",
       "    this.set_frame(this.frames.length - 1);\n",
       "  }\n",
       "\n",
       "  Animation.prototype.slower = function()\n",
       "  {\n",
       "    this.interval /= 0.7;\n",
       "    if(this.direction > 0){this.play_animation();}\n",
       "    else if(this.direction < 0){this.reverse_animation();}\n",
       "  }\n",
       "\n",
       "  Animation.prototype.faster = function()\n",
       "  {\n",
       "    this.interval *= 0.7;\n",
       "    if(this.direction > 0){this.play_animation();}\n",
       "    else if(this.direction < 0){this.reverse_animation();}\n",
       "  }\n",
       "\n",
       "  Animation.prototype.anim_step_forward = function()\n",
       "  {\n",
       "    this.current_frame += 1;\n",
       "    if(this.current_frame < this.frames.length){\n",
       "      this.set_frame(this.current_frame);\n",
       "    }else{\n",
       "      var loop_state = this.get_loop_state();\n",
       "      if(loop_state == \"loop\"){\n",
       "        this.first_frame();\n",
       "      }else if(loop_state == \"reflect\"){\n",
       "        this.last_frame();\n",
       "        this.reverse_animation();\n",
       "      }else{\n",
       "        this.pause_animation();\n",
       "        this.last_frame();\n",
       "      }\n",
       "    }\n",
       "  }\n",
       "\n",
       "  Animation.prototype.anim_step_reverse = function()\n",
       "  {\n",
       "    this.current_frame -= 1;\n",
       "    if(this.current_frame >= 0){\n",
       "      this.set_frame(this.current_frame);\n",
       "    }else{\n",
       "      var loop_state = this.get_loop_state();\n",
       "      if(loop_state == \"loop\"){\n",
       "        this.last_frame();\n",
       "      }else if(loop_state == \"reflect\"){\n",
       "        this.first_frame();\n",
       "        this.play_animation();\n",
       "      }else{\n",
       "        this.pause_animation();\n",
       "        this.first_frame();\n",
       "      }\n",
       "    }\n",
       "  }\n",
       "\n",
       "  Animation.prototype.pause_animation = function()\n",
       "  {\n",
       "    this.direction = 0;\n",
       "    if (this.timer){\n",
       "      clearInterval(this.timer);\n",
       "      this.timer = null;\n",
       "    }\n",
       "  }\n",
       "\n",
       "  Animation.prototype.play_animation = function()\n",
       "  {\n",
       "    this.pause_animation();\n",
       "    this.direction = 1;\n",
       "    var t = this;\n",
       "    if (!this.timer) this.timer = setInterval(function(){t.anim_step_forward();}, this.interval);\n",
       "  }\n",
       "\n",
       "  Animation.prototype.reverse_animation = function()\n",
       "  {\n",
       "    this.pause_animation();\n",
       "    this.direction = -1;\n",
       "    var t = this;\n",
       "    if (!this.timer) this.timer = setInterval(function(){t.anim_step_reverse();}, this.interval);\n",
       "  }\n",
       "</script>\n",
       "\n",
       "<div class=\"animation\" align=\"center\">\n",
       "    <img id=\"_anim_imgUAAZUDIZGVQRHNPX\">\n",
       "    <br>\n",
       "    <input id=\"_anim_sliderUAAZUDIZGVQRHNPX\" type=\"range\" style=\"width:350px\" name=\"points\" min=\"0\" max=\"1\" step=\"1\" value=\"0\" onchange=\"animUAAZUDIZGVQRHNPX.set_frame(parseInt(this.value));\"></input>\n",
       "    <br>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.slower()\">&#8211;</button>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.first_frame()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.previous_frame()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.reverse_animation()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.pause_animation()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.play_animation()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.next_frame()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.last_frame()\"><img class=\"anim_icon\" src=\"\"></button>\n",
       "    <button onclick=\"animUAAZUDIZGVQRHNPX.faster()\">+</button>\n",
       "  <form action=\"#n\" name=\"_anim_loop_selectUAAZUDIZGVQRHNPX\" class=\"anim_control\">\n",
       "    <input type=\"radio\" name=\"state\" value=\"once\" checked> Once </input>\n",
       "    <input type=\"radio\" name=\"state\" value=\"loop\" > Loop </input>\n",
       "    <input type=\"radio\" name=\"state\" value=\"reflect\" > Reflect </input>\n",
       "  </form>\n",
       "</div>\n",
       "\n",
       "\n",
       "<script language=\"javascript\">\n",
       "  /* Instantiate the Animation class. */\n",
       "  /* The IDs given should match those used in the template above. */\n",
       "  (function() {\n",
       "    var img_id = \"_anim_imgUAAZUDIZGVQRHNPX\";\n",
       "    var slider_id = \"_anim_sliderUAAZUDIZGVQRHNPX\";\n",
       "    var loop_select_id = \"_anim_loop_selectUAAZUDIZGVQRHNPX\";\n",
       "    var frames = new Array(0);\n",
       "    \n",
       "  frames[0] = \"\"\n",
       "  frames[1] = \"\"\n",
       "  frames[2] = \"\"\n",
       "  frames[3] = \"\"\n",
       "  frames[4] = \"\"\n",
       "  frames[5] = \"\"\n",
       "  frames[6] = \"\"\n",
       "  frames[7] = \"\"\n",
       "  frames[8] = \"\"\n",
       "  frames[9] = \"\"\n",
       "  frames[10] = \"\"\n",
       "  frames[11] = \"\"\n",
       "  frames[12] = \"\"\n",
       "  frames[13] = \"\"\n",
       "  frames[14] = \"\"\n",
       "  frames[15] = \"\"\n",
       "  frames[16] = \"\"\n",
       "  frames[17] = \"\"\n",
       "  frames[18] = \"\"\n",
       "  frames[19] = \"\"\n",
       "  frames[20] = \"\"\n",
       "  frames[21] = \"\"\n",
       "  frames[22] = \"\"\n",
       "  frames[23] = \"\"\n",
       "  frames[24] = \"\"\n",
       "  frames[25] = \"\"\n",
       "  frames[26] = \"\"\n",
       "  frames[27] = \"\"\n",
       "  frames[28] = \"\"\n",
       "  frames[29] = \"\"\n",
       "  frames[30] = \"\"\n",
       "  frames[31] = \"\"\n",
       "  frames[32] = \"\"\n",
       "  frames[33] = \"\"\n",
       "  frames[34] = \"\"\n",
       "  frames[35] = \"\"\n",
       "  frames[36] = \"\"\n",
       "  frames[37] = \"\"\n",
       "  frames[38] = \"\"\n",
       "  frames[39] = \"\"\n",
       "  frames[40] = \"\"\n",
       "  frames[41] = \"\"\n",
       "  frames[42] = \"\"\n",
       "  frames[43] = \"\"\n",
       "  frames[44] = \"\"\n",
       "  frames[45] = \"\"\n",
       "  frames[46] = \"\"\n",
       "  frames[47] = \"\"\n",
       "  frames[48] = \"\"\n",
       "  frames[49] = \"\"\n",
       "  frames[50] = \"\"\n",
       "  frames[51] = \"\"\n",
       "  frames[52] = \"\"\n",
       "  frames[53] = \"\"\n",
       "  frames[54] = \"\"\n",
       "  frames[55] = \"\"\n",
       "  frames[56] = \"\"\n",
       "  frames[57] = \"\"\n",
       "  frames[58] = \"\"\n",
       "  frames[59] = \"\"\n",
       "  frames[60] = \"\"\n",
       "  frames[61] = \"\"\n",
       "  frames[62] = \"\"\n",
       "  frames[63] = \"\"\n",
       "  frames[64] = \"\"\n",
       "  frames[65] = \"\"\n",
       "  frames[66] = \"\"\n",
       "  frames[67] = \"\"\n",
       "  frames[68] = \"\"\n",
       "  frames[69] = \"\"\n",
       "  frames[70] = \"\"\n",
       "  frames[71] = \"\"\n",
       "  frames[72] = \"\"\n",
       "  frames[73] = \"\"\n",
       "  frames[74] = \"\"\n",
       "  frames[75] = \"\"\n",
       "  frames[76] = \"\"\n",
       "  frames[77] = \"\"\n",
       "  frames[78] = \"\"\n",
       "  frames[79] = \"\"\n",
       "  frames[80] = \"\"\n",
       "  frames[81] = \"\"\n",
       "  frames[82] = \"\"\n",
       "  frames[83] = \"\"\n",
       "  frames[84] = \"\"\n",
       "  frames[85] = \"\"\n",
       "  frames[86] = \"\"\n",
       "  frames[87] = \"\"\n",
       "  frames[88] = \"\"\n",
       "  frames[89] = \"\"\n",
       "  frames[90] = \"\"\n",
       "  frames[91] = \"\"\n",
       "  frames[92] = \"\"\n",
       "  frames[93] = \"\"\n",
       "  frames[94] = \"\"\n",
       "  frames[95] = \"\"\n",
       "  frames[96] = \"\"\n",
       "  frames[97] = \"\"\n",
       "  frames[98] = \"\"\n",
       "  frames[99] = \"\"\n",
       "  frames[100] = \"\"\n",
       "  frames[101] = \"\"\n",
       "  frames[102] = \"\"\n",
       "  frames[103] = \"\"\n",
       "  frames[104] = \"\"\n",
       "  frames[105] = \"\"\n",
       "  frames[106] = \"\"\n",
       "  frames[107] = \"\"\n",
       "  frames[108] = \"\"\n",
       "  frames[109] = \"\"\n",
       "  frames[110] = \"\"\n",
       "  frames[111] = \"\"\n",
       "  frames[112] = \"\"\n",
       "  frames[113] = \"\"\n",
       "  frames[114] = \"\"\n",
       "  frames[115] = \"\"\n",
       "  frames[116] = \"\"\n",
       "  frames[117] = \"\"\n",
       "\n",
       "\n",
       "    /* set a timeout to make sure all the above elements are created before\n",
       "       the object is initialized. */\n",
       "    setTimeout(function() {\n",
       "        animUAAZUDIZGVQRHNPX = new Animation(frames, img_id, slider_id, 50, loop_select_id);\n",
       "    }, 0);\n",
       "  })()\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "117\n"
     ]
    }
   ],
   "source": [
    "# Run a demo of the environment\n",
    "observation = env.reset()\n",
    "cum_reward = 0\n",
    "frames = []\n",
    "a_t = np.zeros([ACTIONS])\n",
    "a_t[env.action_space.sample()] = 1\n",
    "for t in range(5000):\n",
    "    # Render into buffer.  \n",
    "    s_t, reward, done, info = env.step(np.argmax(a_t))\n",
    "    frames.append(env.render(mode = 'rgb_array'))\n",
    "    readout_t = out.predict(s_t[None, :])\n",
    "    a_t = np.zeros([ACTIONS])\n",
    "    a_t[np.argmax(readout_t)] = 1\n",
    "    \n",
    "    if done:\n",
    "        break\n",
    "env.render(close=True)\n",
    "display_frames_as_gif(frames)\n",
    "print(t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  },
  "latex_envs": {
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 0
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
